<?php

// +----------------------------------------------------------------------

// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]

// +----------------------------------------------------------------------

// | Copyright (c) 2006-2013 http://thinkphp.cn All rights reserved.

// +----------------------------------------------------------------------

// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )

// +----------------------------------------------------------------------

// | Author: liu21st <liu21st@gmail.com>

// +----------------------------------------------------------------------

namespace Behavior;

use Think\Storage;

use Think\Think;

/**

 * 系统行为扩展：模板解析

 */

class ParseTemplateBehavior {



    // 行为扩展的执行入口必须是run

    public function run(&$_data){

        $engine             =   strtolower(C('TMPL_ENGINE_TYPE'));

        $_content           =   empty($_data['content'])?$_data['file']:$_data['content'];

        $_data['prefix']    =   !empty($_data['prefix'])?$_data['prefix']:C('TMPL_CACHE_PREFIX');

        if('think'==$engine){ // 采用Think模板引擎

            if((!empty($_data['content']) && $this->checkContentCache($_data['content'],$_data['prefix'])) 

                ||  $this->checkCache($_data['file'],$_data['prefix'])) { // 缓存有效

                //载入模版缓存文件

                Storage::load(C('CACHE_PATH').$_data['prefix'].md5($_content).C('TMPL_CACHFILE_SUFFIX'),$_data['var']);

            }else{

                $tpl = Think::instance('Think\\Template');

                // 编译并加载模板文件

                $tpl->fetch($_content,$_data['var'],$_data['prefix']);

            }

        }else{

            // 调用第三方模板引擎解析和输出

            if(strpos($engine,'\\')){

                $class  =   $engine;

            }else{

                $class   =  'Think\\Template\\Driver\\'.ucwords($engine);                

            }            

            if(class_exists($class)) {

                $tpl   =  new $class;

                $tpl->fetch($_content,$_data['var']);

            }else {  // 类没有定义

                E(L('_NOT_SUPPERT_').': ' . $class);

            }

        }

    }



    /**

     * 检查缓存文件是否有效

     * 如果无效则需要重新编译

     * @access public

     * @param string $tmplTemplateFile  模板文件名

     * @return boolean

     */

    protected function checkCache($tmplTemplateFile,$prefix='') {

        if (!C('TMPL_CACHE_ON')) // 优先对配置设定检测

            return false;

        $tmplCacheFile = C('CACHE_PATH').$prefix.md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX');

        if(!Storage::has($tmplCacheFile)){

            return false;

        }elseif (filemtime($tmplTemplateFile) > Storage::get($tmplCacheFile,'mtime')) {

            // 模板文件如果有更新则缓存需要更新

            return false;

        }elseif (C('TMPL_CACHE_TIME') != 0 && time() > Storage::get($tmplCacheFile,'mtime')+C('TMPL_CACHE_TIME')) {

            // 缓存是否在有效期

            return false;

        }

        // 开启布局模板

        if(C('LAYOUT_ON')) {

            $layoutFile  =  THEME_PATH.C('LAYOUT_NAME').C('TMPL_TEMPLATE_SUFFIX');

            if(filemtime($layoutFile) > Storage::get($tmplCacheFile,'mtime')) {

                return false;

            }

        }

        // 缓存有效

        return true;

    }



    /**

     * 检查缓存内容是否有效

     * 如果无效则需要重新编译

     * @access public

     * @param string $tmplContent  模板内容

     * @return boolean

     */

    protected function checkContentCache($tmplContent,$prefix='') {

        if(Storage::has(C('CACHE_PATH').$prefix.md5($tmplContent).C('TMPL_CACHFILE_SUFFIX'))){

            return true;

        }else{

            return false;

        }

    }    

}

